import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { In, Repository } from 'typeorm';
import { RoleMenu } from './entities/role-menu.entity';

@Injectable()
export class RoleMenuService {
  constructor(
    @InjectRepository(RoleMenu) private readonly roleMenu: Repository<RoleMenu>,
  ) {}

  /**
   * 查询角色菜单列表
   * @param role_id
   * @returns
   */
  findAll(role_id: number) {
    return this.roleMenu.find({
      where: {
        role_id,
      },
      order: {
        "menu_id":"ASC"
      }
    });
  }

  /**
   * 新增多条记录
   * @param insertRows
   * @returns
   */
  insert(insertRows: any[]) {
    return this.roleMenu.insert(insertRows);
  }

  /**
   * 修改角色菜单关联（新增、修改、删除）
   * @param menuIds //菜单数组
   * @param roleId  //角色ID
   */
  async updateRoleMenu(menuIds: number[], roleId: number) {
    try {
      return await this.roleMenu.manager.transaction(async (manager) => {
        // 查找表中的角色菜单
        const roleMenus = await manager.find(RoleMenu, {
          where: { role_id: roleId },
        });

        // 在menuIds中找出roleMenus所没有的,新增表中没有的角色菜单
        let insertRows = menuIds.filter(
          (k) => !roleMenus.some((j) => j.role_id == roleId && j.menu_id == k),
        );
        if (insertRows && insertRows.length > 0) {
          await manager.insert(
            RoleMenu,
            insertRows.map((m) => {
              return {
                role_id: roleId,
                menu_id: m,
              };
            }),
          );
        }

        // 在roleMenus中找出menuIds所没有的，删除表中没有roleMenus的角色菜单
        let deleteRows = roleMenus.filter(
          (k) => !menuIds.some((j) => j == k.menu_id),
        );
        if (deleteRows && deleteRows.length > 0) {
          await manager.delete(RoleMenu, {
            role_id: roleId,
            menu_id: In(deleteRows.map((m) => m.menu_id)),
          });
        }
      });
    } catch (err) {
      return err;
    }
  }
}
